Получить бессмертие и полный боекомплект практически в любой игре - это реально! Потребуется всего лишь hex-редактор и несколько минут свободного времени.
Очень часто ресурсы находятся на поверхности. К примеру, легко можно изменить логотип, лежащий в *.bmp файле. А если логотип имеет расширением *.ttt, или вообще без расширения? Вот тут и возникает растерянность.
Итак, ты установил игрушку. Теперь открывай проводник (тотал), и начинай поиск знакомых файлов (типа *.BMP, *.PCX, *.WAV и т.д). Стратегия проста: нашёл, отредактировал, сохранил. Но эта стратегия работает не всегда. В большинстве случаев ресурсы маскируют, и тут мы переходим к конкретным примерам.
Обычно, разработчики игр маскируют файлы под другими расширениями. Это позволяет спрятать ресурсы от идиотского взгляда ламера, но не от нас с Вами!
Итак, логотипы могут находятся в файлах *.016 и *.256. Первый содержит 16 цветов в палитре, второй 256. Так же могут встречаться расширения *.CRF. ...никакие это не CRF, а простые ZIP-файлы. В большинстве из них лежат PCX-файлы, или звуковые файлы *.WAV.
Бессмертие - обычно представляет манускрипт со смещением ячейки, которую необходимо хакнуть, прописав сюда максимальное количество жизней. Как найти эту позицию в мешанине кода и данных? ...мы пойдем кратчайшим путем - "Поиск различий между дампами в памяти".
Стратегия взлома
Патроны, жизни, и прочее барахло - это переменные, хранящиеся в ячейках памяти и всегда выражаемые числом. Как установить, за что отвечает та или иная ячейка?
Зная точное количество жизней/патронов, мы значительно сужаем круг поиска, исследуя только нужные ячейки. Однако следует помнить, что одни разработчики игр ведут учёт жизней, другие - смертей, причем отсчет может вестись как от единицы, так и от нуля.
С патронами всё обстоит намного лучше и чаще всего они хранятся в памяти "как есть". Допустим, у нас есть 50 патронов и мы ищем 32h в дампе программы (50d=32h). ...да там этих 32h целый мульён!
Ключ к решению лежит в изменениях! Наблюдая за изменениями различных ячеек при определённых условиях игры, легко отделить жизни от патронов. План наших действий выглядит так:
1) Снимаем с программы дамп (сохраняем состояние игры в файле);
2) "Двигаем попой" без потери жизней и патронов, после чего снимаем еще один дамп;
3) Не двигаясь делаем один выстрел и получаем очередной дамп;
4) Повторяем третью операцию несколько раз (3 дампов обычно достаточно);
Сравнение первого и второго дампов показывает кучу отличий, соответствующих изменениям игрового мира. Но патронов/жизней в изменившихся ячейках нет - ведь мы эти параметры заведомо не меняли! Сравниваем второй дамп с третьим...
На этот раз отличий будет не так уж много. Ищем ячейки, изменения которых соответствует количеству выстрелов или потерянных жизней/здоровья. Если таких ячеек больше одной, повторяем операцию 3 до тех пор, пока не останется только одна изменившаяся ячейка.
В некоторых играх количество патронов хранится в нескольких переменных, дублирующих друг друга, но только одна из них значима, а остальные называются "тенями", отвечающими за вывод текущего значения на экран. При модификации "теневой" переменной количество патронов/жизней чаще всего остается неизменным.
Хак в памяти
Сравнивать можно как дампы памяти, снятые с работающей программы, так и "сейвы" - файлы сохранений. Зная адрес нужной ячейки, мы можем повесить резидента, прописывающего сюда максимально возможное значение и обновляющего его каждые несколько секунд.
Начнем со сравнения дампов памяти. Выберем игру и будем над ней издеваться.
Берем любой Hex-редактор (WinHex), находим процесс игры [Alt+F9] и снимаем с работающей игрушки дамп, обзывая его "dump1". Условимся считать, что в этот момент у нас имеется 50 патронов. Возвращаемся в игру, тащим свою задницу куда-нибудь и дампимся еще раз, создавая файл dump2. Затем стреляем и сбрасываем dump3, стреляем еще и получаем dump4.
После всех операций у нас оказываются четыре файла: dump1/dump2 с 50 патронами (32h), и dump3/dump4 с 49(31h) и 48(30h) патронами соответственно. Теперь мы должны сравнить все четыре файла и найти такие ячейки, которые совпадают в dump1 и dump2, но отличаются у всех остальных. Переменные, отвечающие за хранение количества патронов, будут где-то среди них.
Для решения этой задачи запускаем cmd.exe и вводим fc/?:
fc /b dump2 dump3 > log.txt
raw offset dump2 dump3
000A2FF1h: 1Ch 00h
000A2FF6h: 59h 00h
000A2FFAh: 02h 00h
000A2FFCh: FCh 00h
000CFBA0h: FEh FDh
00152262h: A1h 60h
001523E2h: A1h 60h
00166574h: 32h 31h
001666B4h: 32h 31h
00168F28h: 32h 31h
001772A5h: 65h 64h
00177538h: CCh 4Ah
001775ECh: C7h 26h
00177A10h: 08h 04h
00177AC5h: 49h 48h
001C8724h: 06h 0Fh
Сразу в глаза бросается цепочка 32h, 31h, соответствующая десятичным числам: 50 и 49. Ага! Это и есть количество патронов! Эта переменная встречается в дампе трижды по смещениям 00166574h, 001666B4h, 00168F28h. Одна из них настоящая, остальные - тени.
|